/* 
 * File:   VentanaJuego.cpp
 * Author: nahuel
 * 
 * Created on November 3, 2012, 3:07 PM
 */

#include <glibmm-2.4/glibmm/main.h>
#include <gdkmm-3.0/gdkmm/rectangle.h>


#include "VentanaJuego.h"
#include "Trayectoria.h"
#include "Actor.h"
#include "Utilidad.h"
#include "Rol.h"
#include "Posicion.h"
#include "ActoresConstantes.h"
#include "UtilidadesConstantes.h"

using namespace TP::Juego::Arena::Actores;
using namespace TP::Threading;

VentanaJuego::VentanaJuego(Cliente* cliente, float fps) {	
	_dibujador = new Dibujador(this);
	_cliente = cliente;
	
	Glib::signal_timeout().connect(
			sigc::mem_fun(*this, &VentanaJuego::on_timeout), 1000/fps);
	add_events(Gdk::BUTTON_PRESS_MASK);
}

/****************************** Setters ***************************************/

void VentanaJuego::SetImagenPajaroRojo(std::string pathImagen) {
	_imagenPajaroRojo = Gdk::Pixbuf::create_from_file(pathImagen.c_str());
}

void VentanaJuego::SetImagenPajaroVerde(std::string pathImagen) {
	_imagenPajaroVerde = Gdk::Pixbuf::create_from_file(pathImagen.c_str());
}

void VentanaJuego::SetImagenPajaroAzul(std::string pathImagen) {
	_imagenPajaroAzul = Gdk::Pixbuf::create_from_file(pathImagen.c_str());
}

void VentanaJuego::SetImagenCerdito(std::string pathImagen) {
	_imagenCerdito = Gdk::Pixbuf::create_from_file(pathImagen.c_str());
}

void VentanaJuego::SetImagenHuevoPoche(std::string pathImagen) {
	_imagenHuevoPoche = Gdk::Pixbuf::create_from_file(pathImagen.c_str());
}

void VentanaJuego::SetImagenHuevoReloj(std::string pathImagen) {
	_imagenHuevoReloj = Gdk::Pixbuf::create_from_file(pathImagen.c_str());
}

void VentanaJuego::SetImagenHuevoCodorniz(std::string pathImagen) {
	_imagenHuevoCodorniz = Gdk::Pixbuf::create_from_file(pathImagen.c_str());
}

void VentanaJuego::SetImagenHuevoBlanco(std::string pathImagen) {
	_imagenHuevoBlanco = Gdk::Pixbuf::create_from_file(pathImagen.c_str());
}

void VentanaJuego::SetImagenCajaMadera(std::string pathImagen) {
	_imagenCajaMadera = Gdk::Pixbuf::create_from_file(pathImagen.c_str());
}

void VentanaJuego::SetImagenCajaMetal(std::string pathImagen) {
	_imagenCajaMetal = Gdk::Pixbuf::create_from_file(pathImagen.c_str());
}

void VentanaJuego::SetImagenCajaVidrio(std::string pathImagen) {
	_imagenCajaVidrio = Gdk::Pixbuf::create_from_file(pathImagen.c_str());
}

void VentanaJuego::SetImagenCatapulta(std::string pathImagen) {
	_imagenCatapulta = Gdk::Pixbuf::create_from_file(pathImagen.c_str());
}

void VentanaJuego::SetImagenMonticuloHuevos(std::string pathImagen) {
	_imagenMonticuloHuevos = Gdk::Pixbuf::create_from_file(pathImagen.c_str());
}

void VentanaJuego::SetImagenManzana(std::string pathImagen) {
	_imagenManzana = Gdk::Pixbuf::create_from_file(pathImagen.c_str());
}

void VentanaJuego::SetImagenBanana(std::string pathImagen) {
	_imagenBanana = Gdk::Pixbuf::create_from_file(pathImagen.c_str());
}

void VentanaJuego::SetImagenCereza(std::string pathImagen) {
	_imagenCereza = Gdk::Pixbuf::create_from_file(pathImagen.c_str());
}

void VentanaJuego::SetImagenFondo(std::string pathImagen) {
	_fondo = Gdk::Pixbuf::create_from_file(pathImagen.c_str());
}

/******************************************************************************/

bool VentanaJuego::on_draw(const Cairo::RefPtr<Cairo::Context>& context) {
	_dibujador->DibujarFondo(_fondo);
		
	// Dibujamos todos los actores
	Lock lock(_mutex);
	
	vector<Actor*>& vectorActores = _partida->ArenaJuego()->getActores();
	vector<Actor*>::iterator iteradorActores;
	
	for (iteradorActores = vectorActores.begin(); 
		 iteradorActores != vectorActores.end();
		 ++iteradorActores) {
		Actor* actor = *iteradorActores;
		Posicion* posicion = actor->getTrayectoria()->getPosicion();
					
		long int x = posicion->X();
		long int y = posicion->Y();
		Rol* rol = actor->getRol();
		
		if (rol->Nombre() == PAJARITOROJO) {
    		_dibujador->DibujarEntidad(_imagenPajaroRojo, x, y);
		} else if(rol->Nombre() == PAJARITOAZUL) {
			_dibujador->DibujarEntidad(_imagenPajaroAzul, x, y);
		} else if(rol->Nombre() == PAJARITOVERDE) {
			_dibujador->DibujarEntidad(_imagenPajaroVerde, x, y);
		} else if(rol->Nombre() == CERDITO) {
			_dibujador->DibujarEntidad(_imagenCerdito, x, y);
        } else if(rol->Nombre() == HUEVOBLANCO) {
            _dibujador->DibujarEntidad(_imagenHuevoBlanco, x, y);
        } else if(rol->Nombre() == HUEVOPOCHE) {
            _dibujador->DibujarEntidad(_imagenHuevoPoche, x, y);
        } else if(rol->Nombre() == HUEVOCODORNIZ) {
            _dibujador->DibujarEntidad(_imagenHuevoCodorniz, x, y);
        } else if(rol->Nombre() == HUEVORELOJ) {
            _dibujador->DibujarEntidad(_imagenHuevoReloj, x, y);
        }
	}
    
    // Dibujamos todos las utilidades
    vector<Utilidad*>& vectorUtilidades = _partida->ArenaJuego()->getUtilidades();
	vector<Utilidad*>::iterator iteradorUtilidades;
    
    for (iteradorUtilidades = vectorUtilidades.begin(); 
		 iteradorUtilidades != vectorUtilidades.end();
		 ++iteradorUtilidades) {
		Utilidad* utilidad = *iteradorUtilidades;
		Posicion* posicion = utilidad->getPosicion();
					
		long int x = posicion->X();
		long int y = posicion->Y();
		Rol* rol = utilidad->getRol();
        
        if (rol->Nombre() == ROL_CAJA_MADERA) {
            _dibujador->DibujarEntidad(_imagenCajaMadera, x, y);
        } else if (rol->Nombre() == ROL_CAJA_VIDRIO) {
            _dibujador->DibujarEntidad(_imagenCajaVidrio, x, y);
        } else if (rol->Nombre() == ROL_CAJA_METAL) {
            _dibujador->DibujarEntidad(_imagenCajaMetal, x, y);
        } else if (rol->Nombre() == ROL_CATAPULTA) {
            _dibujador->DibujarEntidad(_imagenCatapulta, x, y);
        } else if (rol->Nombre() == ROL_MONTICULOHUEVOS) {
            _dibujador->DibujarEntidad(_imagenMonticuloHuevos, x, y);
        }
    }
}

void VentanaJuego::SetPartida(Partida* partida) {
	Lock lock(_mutex);
	_partida = partida;
}

bool VentanaJuego::on_timeout() {
	// Obliga a la ventana a redibujarse
    Glib::RefPtr<Gdk::Window> window = get_window();
	
    if (window) {
        Gdk::Rectangle rectangulo(0, 0, get_allocation().get_width(),
								        get_allocation().get_height());
        window->invalidate_rect(rectangulo, false);
    }
	
    return true;	
}

bool VentanaJuego::on_button_press_event(GdkEventButton* event) {
	unsigned int x = (unsigned int) event->x;
	unsigned int y = (unsigned int) event->y;	
	
	Posicion pos(x, y);
	_cliente->atacar(&pos);
}

VentanaJuego::~VentanaJuego() {
	delete _dibujador;
}